package service

import (
	"context"
	"fmt"
	"go.uber.org/zap"
	__ "hospital-srv/basic/proto"
	"hospital-srv/handler/dao"
	"hospital-srv/pkg"
	"hospital-srv/untils"
)

// 仪器表
func (s *Serve) Instrument(_ context.Context, in *__.InstrumentReq) (*__.InstrumentResp, error) {
	// 启动MQTT订阅
	untils.StartPublisher("instrument", in.UserId, in.DeviceID, in.BloodSugarValue, in.SystolicBloodPressureValue, in.DiastolicBloodPressureValue, in.BloodOxygenValue, in.TempValue)
	// 消息处理函数
	collect := dao.GetCollectRetail(in)
	// 数据清洗/入库
	errorCodes, _, err := dao.ProcessMqttDataAndPersist(collect)
	if err != nil {
		pkg.Error("MQTT数据清洗/入库失败", zap.Error(err))
		return &__.InstrumentResp{
			Message: "数据清洗/入库失败: " + err.Error(),
		}, err
	}

	// 如果有清洗错误，返回错误信息给用户
	if len(errorCodes) > 0 {
		errorMessage := "数据清洗发现以下问题:\n"
		for i, code := range errorCodes {
			errorMessage += fmt.Sprintf("%d. %s\n", i+1, code)
		}
		pkg.Warn("MQTT数据清洗发现问题", zap.Strings("errors", errorCodes))
		return &__.InstrumentResp{
			Message: errorMessage,
		}, nil
	}
	// 数据清洗成功
	message := "数据清洗成功，已入库"
	pkg.Info("MQTT数据处理完成", zap.String("message", message))
	return &__.InstrumentResp{
		Message: message,
	}, nil
}
